//array 是值类型，slice是引用类型，容量永远等于长度，初始化声明。
//slice 都有一个底层数组，不能操作底层数据向左的数组数据。

package main

import "fmt"

func sliceTest() {
	fmt.Println("-------------- Slice")
	s1 := [8]int{1, 2, 3, 4, 5, 6, 7, 8}
	s2 := s1[3:6] // [3,6)
	fmt.Println(s2)
	fmt.Println(s1)
	s2[0] = 1
	s2[1] = 2
	s2[2] = 3
	//s2[3] = 4 对应s1[6]
	fmt.Println("---res1")
	fmt.Println(s2, cap(s2))
	fmt.Println(s1)

	//s2[3] = 4  对应S1[6],但直接操作会索引越界，需要对S2进行向右扩展。
	s2 = append(s2, 2)
	fmt.Println("---res2")
	fmt.Println(s2)
	fmt.Println(s1)

	s2 = s2[0:cap(s2)]
	fmt.Println("---res3")
	fmt.Println(s2)
	fmt.Println(s1)
	//s2[5] = 6 再次越界
	s2 = append(s2, 1) //此时S2 进行了扩容，返回了新的切片以及新的底层数组。
	fmt.Println("---res4")
	fmt.Println(s2, cap(s2))
	fmt.Println(s1)
}

func demoSlice() {
	a1 := [7]int{1, 2, 3, 4, 5, 6, 7}
	fmt.Printf("a1: %v (len: %d, cap: %d)\n",
		a1, len(a1), cap(a1))
	s9 := a1[1:4]
	//s9[0] = 1
	fmt.Printf("s9: %v (len: %d, cap: %d)\n",
		s9, len(s9), cap(s9))
	for i := 1; i <= 5; i++ {
		s9 = append(s9, i)
		fmt.Printf("s9(%d): %v (len: %d, cap: %d)\n",
			i, s9, len(s9), cap(s9))
	}
	fmt.Printf("a1: %v (len: %d, cap: %d)\n",
		a1, len(a1), cap(a1))
	fmt.Println()
}

func appendTest() {
	a := make([]int, 4)
	b := a[1:3]
	a = append(a, 1)
	a[2] = 42

	fmt.Println(a, cap(a))
	fmt.Println(b, cap(b))
}
